import axios from 'axios'
// import { Message } from 'element-ui'
// import store from '@/store'
// import { getToken } from '@/assets/utils/auth';
// import { Loading } from 'element-ui';
import _ from '@/assets/utils/lodash';
/**
 * 创建 axios 实例
 * baseURL: api的base_url
 * withCredentials: 是否允许带cookie
 * timeout: 请求超时时间 默认60s
 *
 */
const service = axios.create({
  baseURL: process.env.BASE_API,
  withCredentials: true,
  timeout: 0,
  headers: {
  }
});
/**
 * 请求模板
 * @param obj
 * @param isShowLoading 是否显示loading 默认显示
 * @param formatRestful 是否restful格式化入参 默认不转换
 * @param headers 自定义请求头
 * @return {Promise<unknown>}
 */
function base(obj, { isShowLoading = true, formatRestful = false, headers = {} } = {}) {
  let templateHeaders = {
    'Content-Type': 'application/json;charset=UTF-8'
  };
  //自定义请求头处理
  if (headers && Object.keys(headers).length) {
    Object.assign(templateHeaders, headers);
  }
  //请求模板参数
  let defaultObj = {
    method: 'get',
    url: '',
    params: {},
    data: {}
  };
  Object.assign(defaultObj, obj);
  if (formatRestful) {
    if (defaultObj.method === 'get') {
      defaultObj.url = defaultObj.url.restfulFormat(defaultObj.params);
    } else if (defaultObj.method === 'post') {
      if (defaultObj.data instanceof Array && defaultObj.params) {
        defaultObj.url = defaultObj.url.restfulFormat(defaultObj.params);
      } else {
        defaultObj.url = defaultObj.url.restfulFormat(defaultObj.data);
      }
    } else if (defaultObj.method === 'patch') {
      if (defaultObj.data instanceof Array && defaultObj.params) {
        defaultObj.url = defaultObj.url.restfulFormat(defaultObj.params);
      } else {
        defaultObj.url = defaultObj.url.restfulFormat(defaultObj.data);
      }
    } else if (defaultObj.method === 'put') {
      defaultObj.url = defaultObj.url.restfulFormat(defaultObj.data);
    }
  }
  return new Promise((resolve, reject) => {
    service({
      headers: templateHeaders,
      method: defaultObj.method,
      url: defaultObj.url,
      params: defaultObj.params,
      data: defaultObj.data,
      showLoading: isShowLoading,
      timeout: 120000
    }).then(res => {
      resolve(res);
    }, error => {
      reject(error);
    });
  });
}

/**
* Get 请求
* @param url 请求路径
* @param param 请求参数
* @param config
* @return {Promise<>}
*/
export function get(url, param, config = {}) {
  return base({
      url,
      params: param,
      method: 'get'
  }, config);
}
/**
 * Post 请求 请求参数是对象格式
 * @param url 请求路径
 * @param param 请求参数
 * @param config
 * @returns {Promise<any>}
 */
export function post(url, param, data,config = {}) {
  // if(data){
    // 有些接口后台要求post请求时要在url上拼接字段
    // 所以加了param入参
    return base({
      url,
      data: param,
      params:data ? data : {},
      method: 'post'
    }, config);
  // }else {
  //   return base({
  //     url,
  //     data: param,
  //     method: 'post'
  //   }, config);
  // }

}
/**
 * Patch 请求
 * @param url 请求路径
 * @param param 请求参数（请求头）
 * @param data 请求体
 * @param config
 * @returns {Promise<any>}
 * 如果会有两个部分的入参就对应起来（请求头，请求体），如果只有一部分就把另一部分置空
 */
export function patch(url, param, data, config = {}) {
  return base({
    url,
    params: param,
    data: data,
    method: 'patch'
  }, config);
}
/**
 * put 请求
 * @param url 请求路径
 * @param param 请求参数
 * @param config
 * @returns {Promise<any>}
 */
export function put(url, param, config = {}) {
  return base({
    url,
    data: param,
    method: 'put'
  }, config);
}

export default {
  get,
  post,
  patch,
  put
}
